import UIKit

//赋值运算符
let b = 10
var a = 5
a = b //现在a = 10

//如果赋值运算符后边是一个元祖，它的元素可以马上被分解多个常量和变量
var (x, y) = (1, 1)
print("x = \(x), y = \(y)")

//与C，OC不同，Swift的赋值操作并不返回任何值。所以下面代码报错
//if x = y {
//    
//}

//算术运算符 + - * /
1 + 2
5 - 3
2 * 3
10.0 / 2.5

// + 也可以用于String拼接
"hello " + "world"

//两个character或一个String和一个Chracter，相加可以生成一个新的String值。老版本Swift支持，最的不支持了
//let dog: Character = "d"
//let cow: Character = "c"
//let dogCow = dog + cow

//求余. a % b是计算b的多少倍可以容入a，返回多出来的那部分余数
9 % 4
//在对负数求余时，b的符号会被省略。
9 % -4
//浮点数求余。不同于C和OC，Swift可以对浮点数求余，老版本Swift支持，最的不支持了
//8 % 2.5 不支持
//自增 自减 不支持，
var i = 0
//i++
i += 1 //复合赋值

//一元负号来切换
let three = 3
let minThree = -three
let plusThree = -minThree

//一元正号运算符 不做任何改变的返回操作数的值
let minusSix = -6
let alseMinusSix = +minusSix
print(alseMinusSix)
// 复合赋值 a = a * 2 跟 a *= 2一样，把乘法和加法组合成一个运算
// 比较运算符
a == b
a != b
a > b
a < b
a >= b
a <= b

1 == 1
2 != 2
2 > 1
1 < 2
1 >= 1
2 <= 1
//比较运算符多用于条件语句，
let name = "world"
if name == "world" {
    print("hello,world")
} else {
    print("I'm sorry \(name)")
}

//三目运算符 问题?答案1:答案2
let contentHeight = 40
let hasHeader = false
let rowHeight = contentHeight + (hasHeader ? 50 : 20) //注意 ？ 不能与变量挨得太近。否则报错。
//空合运算符 a ?? b。将对可选类型进行空判断。如果a包含一个值就解封，否则返回一个默认值b。a 必须是可选类型，b的类型要和a存储的值保持一致。
var aa: Int?
aa != nil ? a : 0 // 如果满足aa != nil，右边的0就不会执行了，这也就是短路求值

let defaultColor = "red"
var userDefaultColorName: String?
var colorNameToUser = userDefaultColorName ?? defaultColor
//上面的例子，undefinedColorName变量被定义为一个可选类型，默认值为nil,可以用空合运算符去判断其值。由于undefinedColorName为空，因此表达式取后面的defaultColor的值。另个情况，分配一个非空not-nil给userDefaultColorName，再次执行空合运算，运算结果为userDefaultColorName的值。
userDefaultColorName = "green"
colorNameToUser = userDefaultColorName ?? defaultColor

//区间运算符  a..< b 开区间包含a，不包含b ;  a...b 闭区间包含a,b
for index in 1...5 {
    print("\(index) * 5 = \(index * 5)")
}

let names = ["Anna", "Alex", "Brian", "JacK"]
let count = names.count
for i in 0..<count {
    print("第\(i+1)个人叫:\(names[i])")
}

//逻辑运算 逻辑非 !a 逻辑或 a || b 逻辑与 a && b
//逻辑非 对一个Bool值取反。
let allowEntry = false
if !allowEntry {
    print("ACCESS DENIED")
}

//逻辑与 只有a和b同时为true，整个表达式才为true
let enteredDoorCode = true
let passedRetinaScan  = false
if enteredDoorCode && passedRetinaScan {
    print("Welcome")
} else {
    print("ACCESS DEFINED.")
}

//逻辑或 其中一个逻辑表达式为true即为ture
let hasDoorkey = false
let knowsOveridePassword = true
if hasDoorkey || knowsOveridePassword {
    
}

//逻辑运算符组合计算
if enteredDoorCode && passedRetinaScan || hasDoorkey || knowsOveridePassword {
    
}
// 使用括号来明确优先级
if (enteredDoorCode && passedRetinaScan) || hasDoorkey || knowsOveridePassword {
    
}
